/****************************************************************************\
 * @file     BR_RemoteController.c
 * @author   傅帅
 * @date     2019/12/30
 * @brief    遥控器
 ******************************************************************************
 * @note     遥控器有接收解析和整理发送两个任务,负责更新BR_gRobot.RemoteController和将调试信息发至遥控器
 ****************************************************************************/
#include <string.h>
#include "FreeRTOS.h"
#include "queue.h"
#include "BR_Common.h"
#include "arm_math.h"

/* 全局变量 */
TaskHandle_t BR_RemoteControllerHandlerTaskHandler;
TaskHandle_t BR_RemoteControllerPosterTaskHandler;
QueueHandle_t BR_RemoteControllerQueue;                                                                 // 此队列只用于串口收到消息时向任务提供触发信号
/* 静态变量 */
static uint8_t prvTxBuffer[REMOTE_CONTROLLER_TX_MAX_LEN], prvRxBuffer[REMOTE_CONTROLLER_RX_MAX_LEN];    // 接收和发送的字符缓冲区
static void prvOnRemoteControllerRecv(uint8_t *pData, uint32_t Len);                                    // 收到消息回调函数
static void prvControllerStateChange(uint8_t *pMsg);

/* -------------------------------------------------- Public ----------------------------------------------- */
/** @brief 遥控器接收任务本体 **/
void BR_vRemoteControllerHandlerTask(void)
{
    // 接收遥控器指令并解析
    uint32_t RxLen;
    uint8_t *pMsg;                              // 局部指针用于消息处理
    while(1)
    {
        xQueueReceive(BR_RemoteControllerQueue, &RxLen, portMAX_DELAY);
        pMsg = prvRxBuffer;
        // 校验位校验
        // ...
        prvControllerStateChange(prvRxBuffer);  // 处理消息
    }
}
/** @brief 遥控器发送任务本体 **/
void BR_vRemoteControllerPosterTask(void)
{
    while(1)
    {
        vTaskDelay((TickType_t)1000 / BR_RC_SEND_RATE);
    }
}

/** @brief 遥控器初始化 **/
void BR_vRemoteControllerInit(void)
{
    BR_vUsartInitWithDMA(BR_configREMOTE_CONTROLLER_USART, REMOTE_CONTROLLER_BAUDRATE, REMOTE_CONTROLLER_TX_MAX_LEN, REMOTE_CONTROLLER_TX_PRIO, REMOTE_CONTROLLER_RX_MAX_LEN, REMOTE_CONTROLLER_RX_PRIO, prvOnRemoteControllerRecv);
    BR_RemoteControllerQueue = xQueueCreate(1,4);    // Len=1 Size=4Byte  传当前接收帧长度
}

/* -------------------------------------------------- Private ----------------------------------------------- */
/** @brief 遥控器对应串口接收回调 **/
static void prvOnRemoteControllerRecv(uint8_t *pData, uint32_t Len)
{
    BaseType_t IfWoken;
    memcpy(prvRxBuffer, pData, Len);                                // 防止Usart中的缓冲区被更改，先复制到自己的缓冲区
    xQueueSendFromISR(BR_RemoteControllerQueue, &Len, &IfWoken);    // 向任务发送通知
}

/** @brief 根据遥控器信息更新全局变量 **/
static void prvControllerStateChange(uint8_t *pMsg)
{
}
